﻿#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory>
#include"smart_pointer.h"
#include<mutex>
using namespace std;
////循环引用
//struct ListNode//{//	int _data;//	shared_ptr<ListNode> _next;//	shared_ptr<ListNode> _prev;
//	// 这⾥改成weak_ptr，当n1->_next = n2;绑定shared_ptr时//	// 不增加n2的引⽤计数，不参与资源释放的管理，就不会形成循环引⽤了//	/*std::weak_ptr<ListNode> _next;//	std::weak_ptr<ListNode> _prev;*/
//	ListNode(int data) 
//		: _data(data), _next(nullptr), _prev(nullptr)
//	{
//	}
//	~ListNode()//	{//		cout << "~ListNode()" << endl;//	}//};
//int main()
//{
//	// 循环引⽤ -- 内存泄露
//	std::shared_ptr<ListNode> n1(new ListNode(1));//	std::shared_ptr<ListNode> n2(new ListNode(2));//	cout << n1.use_count() << endl;//	cout << n2.use_count() << endl;//	n1->_next = n2;//	n2->_prev = n1;//	cout << n1.use_count() << endl;
//	cout << n2.use_count() << endl;
//	// weak_ptr不⽀持管理资源，不⽀持RAII//	// weak_ptr是专⻔绑定shared_ptr，不增加他的引⽤计数，作为⼀些场景的辅助管理//	//std::weak_ptr<ListNode> wp(new ListNode);
//	return 0;
//}
//int main()
//{
//	std::shared_ptr<string> sp1(new string("111111"));//	std::shared_ptr<string> sp2(sp1);//	std::weak_ptr<string> wp = sp1;//	cout << wp.expired() << endl;//	cout << wp.use_count() << endl;
//	// sp1和sp2都指向了其他资源，则weak_ptr就过期了
//	sp1 = make_shared<string>("222222");//	cout << wp.expired() << endl;//	cout << wp.use_count() << endl;//	sp2 = make_shared<string>("333333");//	cout << wp.expired() << endl;//	cout << wp.use_count() << endl;//	wp = sp1;
//	//std::shared_ptr<string> sp3 = wp.lock();
//	//要访问资源一定要弄一个新的shared_ptr，否则会导致资源泄露
//	auto sp3 = wp.lock();//	cout << wp.expired() << endl;//	cout << wp.use_count() << endl;//	*sp3 += "###";
//	cout << *sp1 << endl;
//	return 0;
//
// }

//线程安全
struct AA{	int _a1 = 0;	int _a2 = 0;	~AA()	{		cout << "~AA()" << endl;
	}};int main(){	smart_pointer::shared_ptr<AA> p(new AA);	const size_t n = 100000;	mutex mtx;	auto func = [&]()		{
			for (size_t i = 0; i < n; ++i)			{
				// 这⾥智能指针拷⻉会++计数
				smart_pointer::shared_ptr<AA> copy(p);				{					unique_lock<mutex> lk(mtx);					copy->_a1++;					copy->_a2++;
									}			}		};	thread t1(func);	thread t2(func);	t1.join();	t2.join();	cout << p->_a1 << endl;	cout << p->_a2 << endl;	cout << p.use_count() << endl;	return 0;
}